"""


英文里有个单词叫 closure，根本就没有对应的中文词
https://www.bilibili.com/video/BV1b3411w7rX/
闭包 = 环境 + 控制
函数能够访问它定义是时候的环境

广义的闭包：函数就是闭包
侠义的闭包：函数访问外层作用域的变量
闭包之所以不会被销毁是因为，内部函数被return出去赋值给了全局变量，
gc不会回收windows下可以访问的变量，而子函数有保存父函数的作用域，
指向父函数，因为子函数不会被销毁，所以父函数也不会被销毁

局部作用域，全局作用域
js如果不加前缀let、var，就是全局变量，
函数的形参也可以看成是局部变量
js在ES6之后才有块级作用域
python没有大括号的写法

js作用域链

js高级程序设计里说：闭包是函数，一个可以访问别的函数作用域里面东西的函数
可以叫闭包函数
函数1{
    函数2{
    }
}
函数1是闭包函数。相对于里面来说，外面的函数是闭包函数
理解为一种现象：一个函数访问了另外一个函数里面的变量，产生了闭包现象

闭包可以避免和全局作用域冲突？
"""


def foo():
    v = 1

    def add():
        nonlocal v
        v += 1

    def get():
        return v

    return add, get


add1, get1 = foo()
add2, get2 = foo()
add1()
print(get1())
print(get2())
add1()
add1()
add1()
print(get1())
print(get2())
# 闭包，起到了变量封装的效果

